<?php
/**
 * 模板跳转参数处理
 * @param array $data
 * @return string
 */
function P($data = array())
{
    $get = $_GET;
    unset($get['_URL_']);
    unset($get['p']);
    return U(strtolower(CONTROLLER_NAME) . '/' . ACTION_NAME, array_merge($get, $data));
}

/**
 * 生成URL-含路由缓存处理
 *
 * @param string       $url
 * @param string|array $vars
 * @param bool         $suffix
 * @param bool         $domain
 * @return string
 */
function RU($url = '', $vars = '', $suffix = true, $domain = false)
{
    if (C('URL_ROUTER_ON') && C('URL_MODEL') == '2') {
        $rules = ytata_get_cache('url');
        if (!empty($vars) && is_array($vars)) {
            $keys     = array_keys($vars);
            $keys_str = '(' . implode('|', $keys) . ')';
        }
        $url_alias = strtolower($url . $keys_str);
        if (!empty($rules[$url_alias])) {
            $url = $rules[$url_alias]['locator'];
            foreach ($vars as $key => $value) {
                $url = str_replace('{' . $key . '}', $value, $url);
            }
            return U($url);
        }
    }

    return U($url, $vars, $suffix, $domain);
}

/**
 * ?前台分页统一
 */
function pager($count, $pagesize = '')
{
    $pagesize = intval($pagesize);
    if (empty($pagesize)) {
        $pagesize = intval(C('YTATA_PAGE_SIZE'));
    }
    $pager           = new Common\Lib\Page($count, $pagesize);
    $pager->rollPage = 8;
    $pager->setConfig('first', '首页');
    $pager->setConfig('prev', '上一页');
    $pager->setConfig('next', '下一页');
    $pager->setConfig('last', '最后一页');
    if (C('YTATA_ENTRANCE') == 'mobile'|| C('YTATA_ENTRANCE') == 'weixin') {
        $pager->setConfig('theme', '%upPage% <span>%nowPage%/%totalPage%</span> %downPage%');
    } else {
        $pager->setConfig('theme', '%first% %upPage% %linkPage% %downPage% %end%');
    }
    return $pager;
}

/**
 * 获取页面SEO信息
 *
 * @param string $alias
 * @param string $type
 * @param array  $array
 * @return string
 */
function SEO($alias = 'home', $type = 'title', $array = array())
{
    $seo  = ytata_get_cache('seo');
    $data = $seo[$alias][$type];
    $data = str_replace('{SITENAME}', C('YTATA_SITE_NAME'), $data);
    if (!empty($array)) {
        $array = array_change_key_case($array, CASE_UPPER);
        foreach ($array as $key => $value) {
            $value = cut_str(strip_tags($value), 60);
            $data  = str_replace('{' . $key . '}', $value, $data);
        }
    }
    return $data;
}

/**
 * 获取缓存
 * @param string $cacheName
 * @return mixed
 */
function ytata_get_cache($cacheName = '')
{
    return \Common\Model\Cache\Instance::make($cacheName)->get();
}

/**
 * 更新缓存
 *
 * @param string $cachetype
 * @return array
 */
function ytata_refresh_cache($cachetype = 'config')
{
    $cache = \Common\Model\Cache\Instance::make($cachetype);
    if (isset($cache)) {
        return $cache->refresh();
    }
}

/**
 * 数据写入配置文件
 * @param string $path
 * @param array  $array
 * @return bool
 */
function ytata_write_cache($path, $array)
{
    $content = "<?php \nreturn ";
    $content .= var_export($array, true) . ";\r\n";
    $content .= "?>";
    if (file_put_contents($path, $content, LOCK_EX)) {
        return true;
    }
    return false;
}

/**
 * 获取IP地址（中文地址）
 * @param string $ip
 * @return string
 */
function get_client_ip_txt($ip = '')
{
    if (empty($ip)) {
        $ip = get_client_ip();
    }
    $Iptxt = new \Common\ORG\IpLocation('UTFWry.dat');
    $val   = $Iptxt->getlocation($ip);
    return $val['country'];
}

/**
 * 时间格式变换,友好提示
 *
 * @param int        $staday 开始时间(时间戳)
 * @param int|string $endday 结束时间(时间戳)
 * @param string     $color  友好提示文本颜色
 * @param string     $format 超过友好提示范围的日期显示格式
 * @param int        $range  友好提示的最大天数
 * @return string
 */
function daterange($staday, $endday = '', $color = '#FF3300', $format = 'Y-m-d', $range = 7)
{
    if (empty($staday)) return '';
    if (empty($endday)) $endday = time();
    $value = $endday - $staday;
    if ($value < 0) {
        return '';
    } elseif ($value >= 0 && $value < 59) {
        $return = ($value + 1) . "秒前";
    } elseif ($value >= 60 && $value < 3600) {
        $min    = intval($value / 60);
        $return = $min . "分钟前";
    } elseif ($value >= 3600 && $value < 86400) {
        $h      = intval($value / 3600);
        $return = $h . "小时前";
    } elseif ($value >= 86400) {
        $d = intval($value / 86400);
        if ($d > $range) {
            return date($format, $staday);
        } else {
            $return = $d . "天前";
        }
    }
    if ($color) {
        $return = "<span style=\"color:{$color}\">" . $return . "</span>";
    }
    return $return;
}

/**
 * 获取相对日期的日期范围
 * @param int $type 相对日期 -1 昨天 0 今天 1 上周 2 本周 3 上月 4 本月 5 上季度 6 本季度
 * @return array [开始日期,结束日期] (时间戳格式)
 */
function get_mktime($type = 1)
{
    switch ($type) {
        case -1:
            $firstday = mktime(0, 0, 0, date('m'), date('d') - 1, date('Y'));
            $lastday  = mktime(0, 0, 0, date('m'), date('d'), date('Y')) - 1;
            break;
        case 0:
            $firstday = mktime(0, 0, 0, date('m'), date('d'), date('Y'));
            $lastday  = mktime(0, 0, 0, date('m'), date('d') + 1, date('Y')) - 1;
            break;
        case 1:
            $firstday = mktime(0, 0, 0, date("m"), date("d") - date("w") + 1 - 7, date("Y"));
            $lastday  = mktime(23, 59, 59, date("m"), date("d") - date("w") + 7 - 7, date("Y"));
            break;
        case 2:
            $firstday = mktime(0, 0, 0, date("m"), date("d") - date("w") + 1, date("Y"));
            $lastday  = mktime(23, 59, 59, date("m"), date("d") - date("w") + 7, date("Y"));
            break;
        case 3:
            $firstday = mktime(0, 0, 0, date("m") - 1, 1, date("Y"));
            $lastday  = mktime(23, 59, 59, date("m"), 0, date("Y"));
            break;
        case 4:
            $firstday = mktime(0, 0, 0, date("m"), 1, date("Y"));
            $lastday  = mktime(23, 59, 59, date("m"), date("t"), date("Y"));
            break;
        case 5:
            $season   = ceil((date('n')) / 3) - 1;//上季度是第几季度
            $firstday = mktime(0, 0, 0, $season * 3 - 3 + 1, 1, date('Y'));
            $lastday  = mktime(23, 59, 59, $season * 3, date('t', mktime(0, 0, 0, $season * 3, 1, date("Y"))), date('Y'));
            break;
        case 6:
            $season   = ceil((date('n')) / 3);//当月是第几季度
            $firstday = mktime(0, 0, 0, $season * 3 - 3 + 1, 1, date('Y'));
            $lastday  = mktime(23, 59, 59, $season * 3, date('t', mktime(0, 0, 0, $season * 3, 1, date("Y"))), date('Y'));
            break;
    }
    return array($firstday, $lastday);
}

/**
 * 发送短信
 * @param  string $mobile [手机号，多个用英文逗号隔开，最多200个]
 * @param  array  $params [短信内容参数数组]
 * @param  string $alias  [短信类型，用户获取短信模板编号]
 * @return mixed        [description]
 *                        用法：
 *                        $mobile = '13855555555';
 *                        $rand=mt_rand(100000, 999999);
 *                        $params = array('code'=>$rand.'','product'=>C('SMS_SIGNATURE'));
 *                        send_sms($mobile,$params,'reg');
 */
function send_sms($mobile, $params, $alias)
{
    $sms_open = C('YTATA_SMS_OPEN');
    if ($sms_open <> '1') {
        $return['status']  = 0;
        $return['content'] = '发送失败，短信功能未开启！';
        return $return;
    }
    $config  = array(
        'appkey'    => C('YTATA_SMS_APPKEY'),
        'secretKey' => C('YTATA_SMS_SECRETKEY'),
        'signature' => C('YTATA_SMS_SIGNATURE')
    );
    $alidayu = \Common\Lib\Sms\Provider::make(C('YTATA_SMS_SERVICE'), $config);
    if (!$alidayu) {
        $return['status']  = 0;
        $return['content'] = '不支持的短信服务提供商！';
        return $return;
    }

    $templateCode = getTemplateCode($alias);
    if ($templateCode == '') {
        $return['status']  = 0;
        $return['content'] = '发送失败，短信模板配置出错！';
        return $return;
    }
    $data   = array(
        'recNum'       => $mobile,
        'params'       => $params,
        'templateCode' => $templateCode
    );
    $result = $alidayu->send($data);
    return $result;
}

/**
 * 获取短信模板编号
 *
 * @param string $alias [短信类型，用户获取短信模板编号]
 * @return string
 */
function getTemplateCode($alias)
{
    $tpl_info = M('SmsTpl')->where(array('alias' => $alias))->find();
    return $tpl_info['tplid'];
}

/**
 * 生成随机字符串
 * @param int $length 生成字符串长度
 * @return string
 */
function randstr($length = 6)
{
    $hash  = '';
    $chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz@#!~?:-=';
    $max   = strlen($chars) - 1;
    mt_srand((double)microtime() * 1000000);
    for ($i = 0; $i < $length; $i++) {
        $hash .= $chars[mt_rand(0, $max)];
    }
    return $hash;
}

/**
 * 密码加密
 * @param string $pwd      密码(明码)
 * @param string $pwd_hash 加密字符
 * @return string
 */
function get_pwdmd5($pwd = '', $pwd_hash = '')
{
    $type = C('YTATA_PWD_MD5TYPE');
    if ($type == "1" || empty($type)) {//默认加密方式
        return md5(md5($pwd) . 'yangtata' . md5($pwd_hash));
    }
    if ($type == "2") {
        return md5($pwd);
    }
    if ($type == "3") {
        return md5($pwd . $pwd_hash);
    }
}

/**
 * 清除标签，转换换行符
 * @param string
 * @return string
 */
function ytata_strip_tags($str)
{
    $str = strip_tags($str);
    $str = str_replace(chr(32), '&nbsp;', $str);
    return nl2br($str);
}

/**
 * 截取字符串
 * @param string $sourcestr
 * @param int    $cutlength
 * @param int    $start
 * @param string $dot
 * @return string
 */
function cut_str($sourcestr, $cutlength, $start = 0, $dot = '...')
{
    $returnstr     = '';
    $i             = 0;
    $n             = 0;
    $str_length    = strlen($sourcestr);
    $mb_str_length = mb_strlen($sourcestr, 'utf-8');
    while (($n < $cutlength) && ($i <= $str_length)) {
        $temp_str = substr($sourcestr, $i, 1);
        $ascnum   = ord($temp_str);
        if ($ascnum >= 224) {
            $returnstr = $returnstr . substr($sourcestr, $i, 3);
            $i         = $i + 3;
            $n++;
        } elseif ($ascnum >= 192) {
            $returnstr = $returnstr . substr($sourcestr, $i, 2);
            $i         = $i + 2;
            $n++;
        } elseif (($ascnum >= 65) && ($ascnum <= 90)) {
            $returnstr = $returnstr . substr($sourcestr, $i, 1);
            $i         = $i + 1;
            $n++;
        } else {
            $returnstr = $returnstr . substr($sourcestr, $i, 1);
            $i         = $i + 1;
            $n         = $n + 0.5;
        }
    }
    if ($mb_str_length > $cutlength) {
        $returnstr = $returnstr . $dot;
    }
    return $returnstr;
}

/**
 * 获取当前页面URL
 * @return string
 */
function ytata_get_url()
{
    $sys_protocal = isset($_SERVER['SERVER_PORT']) && $_SERVER['SERVER_PORT'] == '443' ? 'https://' : 'http://';
    $php_self     = $_SERVER['PHP_SELF'] ? $_SERVER['PHP_SELF'] : $_SERVER['SCRIPT_NAME'];
    $path_info    = isset($_SERVER['PATH_INFO']) ? $_SERVER['PATH_INFO'] : '';
    $relate_url   = isset($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI'] : $php_self . (isset($_SERVER['QUERY_STRING']) ? '?' . $_SERVER['QUERY_STRING'] : $path_info);
    return $sys_protocal . (isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : '') . $relate_url;
}

/**
 * 为表单创建模块/控制器/操作的隐藏文本域参数
 * @return string
 */
function build_url_param($url, $var = '')
{
    $url = parse_url(U($url, $var));
    parse_str($url['query'], $arr);

    $h_input = '';
    foreach ($arr as $name => $value) {
        $h_input .= '<input type="hidden" name="' . $name . '" value="' . $value . '">';
    }

    return $h_input;
}

/**
 * Https请求
 *
 * @param string $url
 * @param array  $data
 * @return bool|mixed
 */
function https_request($url, $data = null)
{
    if (function_exists('curl_init')) {
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL, $url);
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
        curl_setopt($curl, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1);
        if (!empty($data)) {
            curl_setopt($curl, CURLOPT_POST, 1);
            curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
        }
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
        $output = curl_exec($curl);
        curl_close($curl);
        return $output;
    } else {
        return false;
    }
}

/**
 * 判断地址是否http/https开头
 * @param string $url_str
 * @return bool
 */
function is_http($url_str)
{
    return in_array(parse_url($url_str, PHP_URL_SCHEME), array('http', 'https'));
}

/**
 * 实现了php5.6中array_column函数的功能
 */
if (!function_exists('array_column')) {
    function array_column($input, $column_key, $index_key = '')
    {
        if (!is_array($input)) return null;
        $results = array();
        if ($column_key === null) {
            if (!is_string($index_key) && !is_int($index_key)) return false;
            foreach ($input as $_v) {
                if (array_key_exists($index_key, $_v)) {
                    $results[$_v[$index_key]] = $_v;
                }
            }
            if (empty($results)) $results = $input;
        } else if (!is_string($column_key) && !is_int($column_key)) {
            return false;
        } else {
            if (!is_string($index_key) && !is_int($index_key)) return false;
            if ($index_key === '') {
                foreach ($input as $_v) {
                    if (is_array($_v) && array_key_exists($column_key, $_v)) {
                        $results[] = $_v[$column_key];
                    }
                }
            } else {
                foreach ($input as $_v) {
                    if (is_array($_v) && array_key_exists($column_key, $_v) && array_key_exists($index_key, $_v)) {
                        $results[$_v[$index_key]] = $_v[$column_key];
                    }
                }
            }
        }
        return $results;
    }
}
//顶部返回
function TOP_BACK($title)
{ 
$html='<div class="herad_nav"><div class="back J_back" >返回</div><div class="title">'.$title.'</div></div><div class="herad_nav_margin"></div>';
echo  $html;
}
/**
 * 向数组中添加一个元素[如果元素已存在，则不重复添加]
 *
 * @param mixed $val
 * @param array $arr
 */
function array_add($val, $arr)
{
    if (array_search($val, $arr) === false) {
        $arr[] = $val;
    }

    return $arr;
}

/**
 * 表单提交二维数组转换
 * <pre>
 * eg:
 * 转换前：
 * array(
 *    'id' => array(1,2,3),
 *    'title' => array('问答','论坛','文章'),
 * )
 * 转换后：
 * array(
 *   array('id'=>1,'title'=>'问答'),
 *   array('id'=>2,'title'=>'论坛'),
 *   array('id'=>3,'title'=>'文章'),
 * )
 * </pre>
 * @param array $post
 * @return array
 */
function array_form_input($post)
{
    $arr = array();
    $keys = array_keys($post);
    foreach ($post[$keys[0]] as $index => $val) {
        foreach ($keys as $key) {
            $arr[$index][$key] = $post[$key][$index];
        }
    }
    return $arr;
}

/**
 * 获取上传图片url
 */
function uploadimgurl($imgid)
{
    $img = M('UploadImg')->find($imgid);
    if ($img) {
        $imgi = new \Common\Lib\Upload\ImgManager($img);
        return $imgi->url();
    }
}

/**
 * 判断是否匹配ID列表格式 [格式：'id1,id2,id3']
 *
 * @param string $ids
 * @return bool
 */
function is_match_ids($ids)
{
    return preg_match("/^(\d{1,10},)*(\d{1,10})$/", $ids) !== false;
}

// 获取当前URL
function get_request_url()
{
    if (isset($_SERVER['REQUEST_URI'])) {
        $url = $_SERVER['REQUEST_URI'];
    } else {
        if (isset($_SERVER['argv'])) {
            $url = $_SERVER['PHP_SELF'] .'?'. $_SERVER['argv'][0];
        } else {
            $url = $_SERVER['PHP_SELF'] .'?'.$_SERVER['QUERY_STRING'];
        }
    }
    return $_SERVER['HTTP_REFERER'].'://'.$_SERVER['HTTP_HOST'].$url;
}

/**
 * 格式化时间输出
 * @param $timestamp
 * @return string
 */
function formatdate($timestamp)
{
    if (date('Y-m-d') === date('Y-m-d', $timestamp)) {
        return '今天 ' . date('H:i', $timestamp);
    } else {
        return date('m-d H:i', $timestamp);
    }
}

/**
 * 加密函数
 */
function encrypt($txt, $key = '_qscms') {
    // 使用随机数发生器产生 0~32000 的值并 MD5()
    srand((double)microtime() * 1000000);
    $encrypt_key = md5(rand(0, 32000));
    // 变量初始化
    $ctr = 0;
    $tmp = '';
    // for 循环，$i 为从 0 开始，到小于 $txt 字串长度的整数
    for ($i = 0; $i < strlen($txt); $i++) {
        // 如果 $ctr = $encrypt_key 的长度，则 $ctr 清零
        $ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;
        // $tmp 字串在末尾增加两位，其第一位内容为 $encrypt_key 的第 $ctr 位，
        // 第二位内容为 $txt 的第 $i 位与 $encrypt_key 的 $ctr 位取异或。然后 $ctr = $ctr + 1
        $tmp .= $encrypt_key[$ctr] . ($txt[$i] ^ $encrypt_key[$ctr++]);
    }
    // 返回结果，结果为 passport_key() 函数返回值的 base64 编码结果
    return base64_encode(passport_key($tmp, $key));
}

/**
 * Passport 解密函数
 *
 * @param        string          加密后的字串
 * @param        string          私有密匙(用于解密和加密)
 *
 * @return       string          字串经过私有密匙解密后的结果
 */
function decrypt($txt, $key = '_qscms') {
    // $txt 的结果为加密后的字串经过 base64 解码，然后与私有密匙一起，
    // 经过 passport_key() 函数处理后的返回值
    $txt = passport_key(base64_decode($txt), $key);
    // 变量初始化
    $tmp = '';
    // for 循环，$i 为从 0 开始，到小于 $txt 字串长度的整数
    for ($i = 0; $i < strlen($txt); $i++) {
        // $tmp 字串在末尾增加一位，其内容为 $txt 的第 $i 位，
        // 与 $txt 的第 $i + 1 位取异或。然后 $i = $i + 1
        $tmp .= $txt[$i] ^ $txt[++$i];
    }
    // 返回 $tmp 的值作为结果
    return $tmp;
}

/**
 * Passport 密匙处理函数
 *
 * @param        string          待加密或待解密的字串
 * @param        string          私有密匙(用于解密和加密)
 *
 * @return       string          处理后的密匙
 */
function passport_key($txt, $encrypt_key) {
    // 将 $encrypt_key 赋为 $encrypt_key 经 md5() 后的值
    $encrypt_key = md5($encrypt_key);
    // 变量初始化
    $ctr = 0;
    $tmp = '';
    // for 循环，$i 为从 0 开始，到小于 $txt 字串长度的整数
    for ($i = 0; $i < strlen($txt); $i++) {
        // 如果 $ctr = $encrypt_key 的长度，则 $ctr 清零
        $ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;
        // $tmp 字串在末尾增加一位，其内容为 $txt 的第 $i 位，
        // 与 $encrypt_key 的第 $ctr + 1 位取异或。然后 $ctr = $ctr + 1
        $tmp .= $txt[$i] ^ $encrypt_key[$ctr++];
    }
    // 返回 $tmp 的值作为结果
    return $tmp;
}

/**
 * url查询字符串拼接
 * @param $uri
 * @param $data
 * @return string
 */
function ytata_parseurl($uri, $arr_query=array())
{
    $arrurl = parse_url($uri);
    $url = '';
    if ($arrurl['scheme']) {
        $url .= $arrurl['scheme'] . '://';
    }
    $url .= $arrurl['host'] . $arrurl['path'];
    $query = array();
    if ($arrurl['query']) {
        parse_str($arrurl['query'], $query);
    }
    if (!empty($arr_query)) {
        $query = array_merge($query, $arr_query);
    }
    if (!empty($query)) {
        $url .= '?' . http_build_query($query);
    }

    if ($arrurl['fragment']) {
        $url .= '#' . $arrurl['fragment'];
    }
    return $url;
}
?>